/**
 *Copyright (c) 2024 watereyes
 * safetymanagement is licensed under Mulan PubL v2.
 * You can use this software according to the terms and conditions of the Mulan
 * PubL v2.
 * You may obtain a copy of Mulan PubL v2 at:
 *          http://license.coscl.org.cn/MulanPubL-2.0
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PubL v2 for more details.
 */
package com.koron.workflow.service.api;

import com.koron.workflow.bean.MessageEntity;
import com.koron.workflow.bean.TaskListBean;
import org.swan.bean.MessageBean;

import java.util.HashMap;
import java.util.List;

public interface WorkflowService {


	/**
	 * 启动工作流程
	 * @param setCode		流程模板组code
	 * @param processCode	流程模板code
	 * @param billId		业务id
	 * @param operator		操作人账号
	 * @param title			标题
	 * @param comment		说明
	 * @param formVariables 业务参数
	 * @param otherNodeCandidates 处理人
	 * @param attachment	附件标识
	 * @return
	 */
	MessageBean<?> start(String setCode,String processCode,String billId,String operator,String title,String comment,String formVariables,String otherNodeCandidates,String attachment) throws Exception;

	/**
	 * 获取流程操作界面
	 * @param setCode		流程模板组code
	 * @param processCode	流程模板code
	 * @param operator		操作人账号
	 * @param taskId		流程节点id
	 * @param approverUserAccound		当前节点审核人，多人以，隔开
	 * @param processInstanceId	流程实例id
	 * @return
	 * @throws Exception
	 */
	String view(String setCode,String processCode,String operator,String taskId,String approverUserAccound,String processInstanceId) throws Exception;

	/**
	 * 移动端获取流程操作界面
	 * @param setCode		流程模板组code
	 * @param processCode	流程模板code
	 * @param operator		操作人账号
	 * @param taskId		流程节点id
	 * @param approverUserAccound		当前节点审核人，多人以，隔开
	 * @param processInstanceId	流程实例id
	 * @return
	 * @throws Exception
	 */
	String appView(String setCode, String processCode, String operator,String taskId, String approverUserAccound,String processInstanceId) throws Exception;

	/**
	 * 流程办理
	 * @param setCode	流程模板组code
	 * @param processCode	流程模板code
	 * @param billId	业务id
	 * @param operator	操作人账号
	 * @param taskId	任务id
	 * @param comment	处理意见
	 * @param operation	操作类型：1驳回、2转办、4添加沟通人、8催办、16废弃、32通过、64 添加沟通/评论信息、128取消沟通
	 * @param rejectNodeCode	operation为1时  选择驳回到哪个节点的节点的code
	 * @param relatedUser	操作对应的人员信息.operation为2和4 时该参数必须有，转办人和沟通人.多人，隔开
	 * @param formVariables	表单变量对象。
	 * @param otherNodeCandidates	当配置有可修改必须修改节点时，指定节点处理人.<br/>如流程设计时节点有设置权限属性“可修改节点或必须修改节点”，则：当operation为32时需指定对应节点的审批人<br/>多办理人以中划线隔开<br/>例子：{"kancha":["zxy","fhq"]}
	 * @param attachment	附件标识
	 * @return
	 * @throws Exception
	 */
	MessageBean<?> submit(String setCode,String processCode,String billId,String operator,String taskId,String approverUserAccound,String comment,Integer operation,String rejectNodeCode,String relatedUser,String formVariables,String otherNodeCandidates,String attachment) throws Exception;

	/**
	 * 流程轨迹
	 * @param setCode	流程模板组code
	 * @param processCode	流程模板code
	 * @param billId	业务id
	 * @return
	 * @throws Exception
	 */
	MessageBean<?> history(String setCode,String processCode,String billId) throws Exception;

	/**
	 * 移动端获取流程审批历史表单页面
	 * @param setCode    流程模板组code
	 * @param processCode   流程模板code
	 * @param processInstanceId   流程实例id
	 * @return
	 * @throws Exception
	 */
	String appHistory(String setCode, String processCode, String processInstanceId) throws Exception;

	/**
	 * 工作流列表
	 * @param setCode	流程模板组code,为空查所有组的流程
	 * @param processCode	流程模板code,为空查所有类型流程
	 * @param billId	业务id,为空查所有单据
	 * @param title		标题，不为空模糊搜索
	 * @param startDate	开始日期
	 * @param endDate	开始日期
	 * @param type	类型<br/>1我发起的<br>2我待审的（未办理、可认领、可沟通）<br>3参与的(我发起、我已办理、我已沟通)<br>4我已沟通的<br>5我已办的（包含我发起和我已经办，不含待审）
	 * @param status	状态<br/>2已结束 1未结束  0或不传  所有
	 * @param operator	操作人登陆帐号
	 * @param page	第几页 默认0
	 * @param pageCount	每页条数 默认20
	 * @return
	 * @throws Exception
	 */
	MessageEntity<?> list(String setCode,String processCode,String billId,String title,String startDate,String endDate,Integer type,Integer status,String operator,Integer page,Integer pageCount) throws Exception;

	/**
	 * 获取工作流列表
	 *
	 * @param staffcode
	 *            人员code
	 * @param type
	 *            1我发起的2我待审的（包含未办理和我可认领）3参与的(我发起、我办理、我沟通)4我沟通的5结束（包含我发起和我经办）
	 * @param templateKey
	 *            模板
	 * @param page
	 *            当前页
	 * @param pagecount
	 *            每页条数
	 * @return
	 * @throws Exception
	 */
	MessageEntity<List<TaskListBean>> getWorkflowList(String staffcode, Integer type, String templateKey, Integer page,
			Integer pagecount) throws Exception;

	/**
	 * 工作流提交前所需要表单
	 *
	 * @param templateKey
	 *            工作流模板
	 * @param taskId
	 *            任务ID
	 * @return
	 * @throws Exception
	 */
	String workflowPresubmit(String staffcode, String templateKey, String taskId, String processInstId)
			throws Exception;


	/**
	 * 获取节点信息
	 *
	 * @param templateKey
	 *            流程实例ID
	 * @param taskId
	 *            任务id
	 * @return
	 * @throws Exception
	 */
	MessageEntity<HashMap<String, Object>> workflowNodeInfo(String templateKey, String taskId) throws Exception;

	String grabHistory(String workflowInstanceId) throws Exception;

}
